const path = require("path");
const express = require("express");
const formidable = require("formidable");
const adminListC = require("./Db/collections/adminList");
const advListC = require("./Db/collections/advList");
const {getMd5, getNowTime, jwtEncode, jwtDecode} = require("./utils");
const {userMiddleware} = require("./middleware");
const app = express();
// 将upload目录作为站点的静态资源目录
app.use(express.static(path.resolve(__dirname,"./upload")));
app.use(express.json());// 设置响应体的数据格式'

// 添加管理员接口
app.post("/admin",userMiddleware,async (req,res)=>{
	// 1- 接收数据
	// 2- 验证数据-（管理员账号是否已经存在）
	//    2-1 存在：给予异常提示---》管理员账号已经存在，不允许重复添加
	//    2-2 不存在：添加管理员-----》给予成功响应----》添加管理员成功
	try{
		const {adminName,password} = req.body;
		// 检查账号是否存在
		const count = await adminListC.count({adminName});
		if(count > 0){
			// 存在相同的账号
			res.json({
				ok:-1,
				msg:"管理员账号已经存在，不允许重复添加"
			})
			return;
		}
		await adminListC.insertOne({
			adminName,
			password:getMd5(password),
			loginTime:getNowTime(),
			regTime:getNowTime()
		});
		res.json({
			ok:1,
			msg:"添加管理员成功"
		})
	}catch (err){
		res.json({
			ok:-1,
			msg:err.message
		})
	}


});

// 获取管理员列表
app.get("/adminList",userMiddleware,async (req,res)=>{
	try{

		console.log(req.payload);// 操作日志
		// 获取到的管理员列表
		const adminList = await adminListC.find({
			sortObj:{
				regTime:-1
			}
		});
		res.json({
			ok:1,
			msg:"获取成功",
			adminList
		})

	}catch (err){
		res.json({
			ok:-1,
			msg:err.message
		})
	}
});

// 完成登陆功能
app.post("/login",async (req,res)=>{
	try{
		// 1- 接收数据
		const {adminName,password} = req.body;
		// 2- 验证数据
		const info = await adminListC.findOne({
			adminName,
			password:getMd5(password)
		})
		// 3- 响应结果
		if(info){
			res.json({
				ok:1,
				msg:"登陆成功",
				token:jwtEncode({
					adminName:info.adminName,
					adminId:info._id
				})
			})
		}else{
			res.json({
				ok:-1,
				msg:"账号或密码错误！"
			})
		}
	}catch (err){
		res.json({
			ok:-1,
			msg:err.message
		})
	}
})
// 修改广告
app.put("/adv/:id",userMiddleware,async(req,res)=>{
	try{
		// 收集数据
		const {id} = req.params;
		const form = new formidable.IncomingForm({
			// 1- 图片存储的位置
			uploadDir:path.resolve(__dirname,"./upload"),
			// 2- 保留扩展名
			keepExtensions:true,
			allowEmptyFiles:true,
			minFileSize:0
		});
		console.log(1111)
		// params: 非图片内容
		let [params,file] = await form.parse(req);
		params = {
			advTitle:params.advTitle[0],
			advHref:params.advHref[0],
			advOrder:params.advOrder[0]/1,
			advType:params.advType[0]/1,
			upTime:getNowTime()
		}
		// 修改内容---1- 未提交图片  2- 已提交图片
		if(file.advPic[0].size>0){
			params.advPic = file.advPic[0].newFilename
		}
		await advListC.updateOneById(id,params)
		res.json({
			ok:1,
			msg:"修改成功"
		})
	}catch (err){
		console.log(err);
		res.json({
			ok:-1,
			msg:err.message
		})
	}
})
// 添加广告
app.post("/adv",userMiddleware,async(req,res)=>{
	try{
		// 1- formidable---->cnpm i formidable
		const form = new formidable.IncomingForm({
			// 1- 图片存储的位置
			uploadDir:path.resolve(__dirname,"./upload"),
			// 2- 保留扩展名
			keepExtensions:true
		});
		// params: 非图片内容
		const [params,file] = await form.parse(req);
		await advListC.insertOne({
			advTitle:params.advTitle[0],
			advHref:params.advHref[0],
			advOrder:params.advOrder[0]/1,
			advType:params.advType[0]/1,
			advPic:file.advPic[0].newFilename,
			addTime:getNowTime(),
			upTime:getNowTime()
		})
		res.json({
			ok:1,
			msg:"添加广告"
		})
	}catch (err){
		res.json({
			ok:-1,
			msg:err.message
		})
	}
})
// 获取广告列表
app.get("/advList",userMiddleware,async (req,res)=>{
	try{
		let {pageNo=1,pageSize=3,keyword} = req.query;
		pageNo = pageNo/1;
		pageSize = pageSize/1;
		const whereObj = {};
		if(keyword){
			whereObj.advTitle = new RegExp(keyword);// 广告一
		}
		const count = await advListC.count(whereObj);
		let pageSum = Math.ceil(count/pageSize);// 总页数
		if(pageSum<1) pageSum = 1;
		if(pageNo<1) pageNo = 1;
		if(pageNo>pageSum) pageNo = pageSum;
		const advList = await advListC.find({
			whereObj,
			sortObj:{
				advOrder:-1,
				addTime:-1
			},
			limit:pageSize,
			skip:(pageNo-1)*pageSize
		});
		res.json({
			ok:1,
			msg:"获取成功",
			advList,
			pageSum,
			pageNo
		})

	}catch (err){
		res.json({
			ok:-1,
			msg:err.message
		})
	}
})

// 获取广告：广告类别  广告的条数
app.get("/advList/:type/:limit",async(req,res)=>{
	try{
		const advList = await advListC.find({
			whereObj:{
				advType:req.params.type/1
			},
			sortObj:{
				advOrder:-1,
				addTime:-1
			},
			limit:req.params.limit/1
		});
		res.json({
			ok:1,
			advList
		})
	}catch (err){
		res.json({
			ok:1,
			msg:err.message
		})
	}
})
app.listen(8092,()=>{
	console.log("success")
})